package ar.edu.isft189.pdfBox;

import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

public class PdfBox {

	private static String formPDF = null;
	private static String formXML = null;
	private static String filesep = System.getProperty("file.separator");
	private static JpdfForm frm;

	public PdfBox(String nomForm) {
		init(nomForm);
	}

	/**
	 * Metodo que se encarga de Cargar los directorios donde estan los pdf
	 * 
	 * @param nomForm
	 * @param headerMap
	 * @param gridMap
	 */
	private void init(String nomForm) {
		
		try {
			/*
			 * Carga de las propiedades de la aplicacion como el diretorio de
			 * los formularios y de cada uno de los pdf y xml de los mismos
			 */
			Config.execute();

			String path = Config.getMapaDir().get(nomForm) + filesep;
			Config.setDirForms(Config.getDirForms() + filesep + path);

			formPDF = nomForm + ".pdf";
			formXML = nomForm + ".xml";

			frm = new JpdfForm(formPDF, formXML);
			frm.debug();
			frm.start();
		} catch (Exception e) {
			e.getStackTrace();
			e.printStackTrace();
		}
	}

	/**
	 * Metodo que inserta datos en el pdf pero recibe como parametro un hasmap
	 * con los nombres de los campos
	 * 
	 * @param map
	 * @return boolean	 */

	
	@SuppressWarnings("rawtypes")
	public boolean insertFields(HashMap map) {
		try {

			// Obtengo las claves del header
			Iterator iter = map.entrySet().iterator();

			// Recorro el header e inserto en el formulario

			while (iter.hasNext()) {

				Map.Entry ent = (Map.Entry) iter.next();
				String k = (String) ent.getKey();
				String x = (String) ent.getValue();

				if (x.startsWith("@")) {
					if (x.contains("day")) {
						frm.setFieldValue(x, Utils.getDia());
					}

					if (x.contains("monthName")) {
						frm.setFieldValue(x, Utils.getMes());
					}

					if (x.contains("year")) {
						frm.setFieldValue(x, Utils.getAnio());
					}
				} else {
					System.out.println("Ingreso: " + k + " Valor: " + x);
					frm.setFieldValue(k, x);
				}
			}

			return true;

		} catch (Exception e) {
			e.getStackTrace();
			e.printStackTrace();

			return false;
		}
	}

	/**
	 * Metodo que inserta datos en el pdf pero recibe como parametro un List con
	 * los datos para insertar
	 * 
	 * @param list
	 *            (dato a insertar)
	 * @return boolean
	 */

	public boolean insertFieldsHead(List<String> list) {
		try {

			Set<String> headerList = new LinkedHashSet<String>();
			headerList = frm.getHeaderForm();

			int index = 0;
			for (String hf : headerList) {
				System.out.println("CLAVE: " + hf + " DATO: "
						+ list.get(index).toString());
				frm.setFieldValue(hf, list.get(index).toString());
				index++;
			}

			return true;

		} catch (Exception e) {
			e.getStackTrace();
			e.printStackTrace();

			return false;
		}
	}

	/**
	 * Metodo que recibe una lista con los datos que se van a insetar en la
	 * grilla del formulario. Inserta de a una fila
	 * 
	 * @param list
	 * @return boolean
	 */
	
	public boolean insertRowFields(List<String> list, boolean first) {
		try {

			Set<String> headerGrid = new LinkedHashSet<String>();
			headerGrid = frm.getHeaderGrid();

			if (first) {
				frm.first();// Posiciono en la primera posicion
			} else {
				frm.next(); // Posiciono en la siguiente posicion
			}

			int index = 0;
			for (String hg : headerGrid) {
				System.out.println("CLAVE: " + hg + " DATO: "
						+ list.get(index).toString());
				frm.setFieldRowValue(hg, list.get(index).toString());
				index++;
			}

			return true;

		} catch (Exception e) {
			e.getStackTrace();
			e.printStackTrace();

			return false;
		}
	}
	
	public void preview(){
		frm.preview();		
	}

}